//------------------------------------------------------------------------------
// <copyright file="SqlStreamChars.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
//  </copyright>                                                                
// <owner current="true" primary="true">junfang</owner>
// <owner current="true" primary="false">Microsoft</owner>
// <owner current="true" primary="false">Microsoft</owner>
//------------------------------------------------------------------------------

//**************************************************************************
// @File: SqlStreamChars.cs
//
// Create by:	JunFang
//
// Description: 
//
// Notes: 
//	
// History:
//
//   04/17/01  JunFang	Created.
//
// @EndHeader@
//**************************************************************************

namespace System.Data.SqlTypes 
	{
	using System;
	using System.IO;
	using System.Runtime.InteropServices;
	using System.Data.SqlTypes;

	internal abstract class SqlStreamChars: System.Data.SqlTypes.INullable, IDisposable
		{
		public abstract bool IsNull { get; }

		public abstract bool CanRead { get; }

		public abstract bool CanSeek { get; }

		public abstract bool CanWrite { get; }

		public abstract long Length { get; }

		public abstract long Position { get; set; }

		// --------------------------------------------------------------
		//	  Public methods
		// --------------------------------------------------------------
		public abstract int Read (char[] buffer, int offset, int count);

		public abstract void Write (char[] buffer, int offset, int count);

		public abstract long Seek (long offset, SeekOrigin origin);

		public abstract void SetLength (long value);

		public abstract void Flush ();

		public virtual void Close(){
			Dispose(true);
		}

		void IDisposable.Dispose() {
            Dispose(true);           
        }

		protected virtual void Dispose(bool disposing) {           
		}

		public virtual int ReadChar()
			{
			// Reads one char from the stream by calling Read(char[], int, int). 
			// Will return an char cast to an int or -1 on end of stream.
			// The performance of the default implementation on Stream is bad,
			// and any subclass with an internal buffer should override this method.
			char[] oneCharArray = new char[1];
			int r = Read(oneCharArray, 0, 1);
			if (r==0)
				return -1;
			return oneCharArray[0];
			}

		public virtual void WriteChar(char value)
			{
			// Writes one char from the stream by calling Write(char[], int, int).  
			// The performance of the default implementation on Stream is bad,
			// and any subclass with an internal buffer should override this method.
			char[] oneCharArray = new char[1];
			oneCharArray[0] = value;
			Write(oneCharArray, 0, 1);
			}


		// Private class: the Null SqlStreamChars
		private class NullSqlStreamChars : SqlStreamChars
			{
			// --------------------------------------------------------------
			//	  Constructor(s)
			// --------------------------------------------------------------

			internal NullSqlStreamChars()
				{
				}


			// --------------------------------------------------------------
			//	  Public properties
			// --------------------------------------------------------------

			public override bool IsNull 
				{
				get 
					{
					return true;
					}
				}

			public override bool CanRead
				{
				get
					{
					return false;
					}
				}

			public override bool CanSeek
				{
				get
					{
					return false;
					}
				}

			public override bool CanWrite
				{
				get
					{
					return false;
					}
				}

			public override long Length
				{
				get
					{
					throw new SqlNullValueException();
					}
				}

			public override long Position
				{
				get
					{
					throw new SqlNullValueException();
					}
				set
					{
					throw new SqlNullValueException();
					}
				}

			// --------------------------------------------------------------
			//	  Public methods
			// --------------------------------------------------------------
			public override int Read (char[] buffer, int offset, int count)
				{
				throw new SqlNullValueException();
				}

			public override void Write (char[] buffer, int offset, int count)
				{
				throw new SqlNullValueException();
				}

			public override long Seek (long offset, SeekOrigin origin)
				{
				throw new SqlNullValueException();
				}

			public override void SetLength (long value)
				{
				throw new SqlNullValueException();
				}

			public override void Flush ()
				{
				throw new SqlNullValueException();
				}

			public override void Close ()
				{
				}

			} // class NullSqlStreamChars


		// The Null instance
		public static SqlStreamChars Null {
                    get {
                        return new NullSqlStreamChars();
                    }
		}

		} // class SqlStreamChars

	} // namespace System.Data.SqlTypes 
